home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
ghspt261.gz
/
ghspt261
/
gs261
/
unix-lpr.sh
< prev
next >
Wrap
Linux/UNIX/POSIX Shell Script
|
1993-05-07
|
4KB
|
151 lines
#!/bin/sh
#
# Unix lpr filter. The default setup sends output directly to a pipe,
# which requires the Ghostscript process to fork, and thus may cause
# small systems to run out of memory/swap space. An alternative strategy,
# based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named
# pipe for output, which avoids the fork and can thus save a lot of memory.
#
# Unfortunately this approach can cause problems when a print job is aborted,
# as the abort can cause one of the processes to die, leaving the process
# at the other end of the pipe hanging forever.
#
# Because of this, the named pipe method has not been made the default,
# but it may be restored by commenting out the lines referring to
# 'gsoutput' and uncommenting the lines referring to 'gspipe'.
#
PBMPLUSPATH=/usr/local/pbmplus/bin
PSFILTERPATH=/usr/local/tran/sparc/lib
LOCALPATH=/usr/local/bin
X11HOME=/usr/local/X11R5
PATH=/bin:/usr/bin:/usr/ucb:/usr/etc
PATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH}
LD_LIBRARY_PATH=${X11HOME}/lib
export PATH LD_LIBRARY_PATH acctfile host user
user= host= acctfile=/dev/null
#
# Redirect stdout to stderr (for the logfile) and open a new channel
# connected to stdout for the raw data. This enables us to keep the
# raw data separate from programmed postscript output and error messages.
#
exec 3>&1 1>&2
#
# Get username and hostname from filter parameters
#
while [ $# != 0 ]
do case "$1" in
-n) user=$2 ; shift ;;
-h) host=$2 ; shift ;;
-*) ;;
*) acctfile=$1 ;;
esac
shift
done
#
# Get the filter, printer device and queue type (direct/indirect)
#
filter=`basename $0`
device=`dirname $0`
type=`dirname ${device}`
device=`basename ${device}`
type=`basename ${type}`
#
# Find the bpp, if specified
#
case "${device}" in
*.24) device=`basename ${device} .24` ; bpp=24 ;;
*.16) device=`basename ${device} .16` ; bpp=16 ;;
*.8) device=`basename ${device} .8` ; bpp=8 ;;
*.3) device=`basename ${device} .3` ; bpp=3 ;;
*.1) device=`basename ${device} .1` ; bpp=1 ;;
*) bpp=1 ;;
esac
#
# Information for the logfile
#
lock=`dirname ${acctfile}`/lock
cf=`tail -1 ${lock}`
job=`egrep '^J' ${cf} | tail +2c`
echo "gsbanner: ${host}:${user} Job: ${job} Date: `date`"
echo "gsif: ${host}:${user} ${device}.${bpp} start - `date`"
#
# Set the direct or indirect output destinations
#
#gspipe=/tmp/gspipe.$$
#mknod ${gspipe} p
case "${type}" in
direct)
gsoutput="cat 1>&3" ;;
# cat ${gspipe} 1>&3 & ;;
indirect)
gsoutput="lpr -P${device}.raw" ;;
# cat ${gspipe} | lpr -P${device}.raw & ;;
esac
(
#
# Any setup required may be done here (eg. setting gamma for colour printing)
#
echo "{0.333 exp} dup dup currenttransfer setcolortransfer"
#
# The input data is filtered here, before being passed on to Ghostscript
#
case "${filter}" in
gsif) cat ;;
gsnf) psdit ;;
gstf) pscat ;;
gsgf) psplot ;;
gsvf) rasttopnm | pnmtops ;;
gsdf) dvi2ps -sqlw ;;
gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;;
esac
#
# This is the postlude which does the accounting
#
echo "\
(acctfile) getenv
{ currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt
{ exch (a) file /acctfile exch def
/string 20 string def
string cvs dup length dup
4 lt
{ 4 exch sub
{ acctfile ( ) writestring } repeat
} { pop } ifelse
acctfile exch writestring
acctfile (.00 ) writestring
acctfile (host) getenv
{ string cvs } { (NOHOST) } ifelse writestring
acctfile (:) writestring
acctfile (user) getenv
{ string cvs } { (NOUSER) } ifelse writestring
acctfile (\n) writestring
acctfile closefile
} { pop } ifelse
} if
quit"
) | gs -q -dNOPAUSE -sDEVICE=${device} -dBitsPerPixel=${bpp} \
-sOutputFile=\|"${gsoutput}" -
# -sOutputFile=${gspipe} -
rm -f ${gspipe}
#
# End the logfile entry
#
echo "gsif: end - `date`"